#include "../include/ModeleObj.h"

#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

/**
* Methode permettant de lire dans un fichier un model obj
* @param fichier le nom du fichier (format .obj)
* @param position position de l'objet
* @param m matériaux attribué à l'objet
* @return un model obj
*/
ModeleObj::ModeleObj(char* fichier, pVect position, Materiaux m)
{
	string STRING;
	ifstream infile;
	infile.open (fichier);
	vector<pVect> listPVect;
        while(!infile.eof())
        {
	        getline(infile,STRING);
            istringstream iss(STRING);
            string sub;
            if(iss){
                iss>>sub;
                // v la ligne décrit un point
                // on stocke toutes les coordonnées du point
                if(sub == "v"){
                    pVect toto;
                    iss>>toto.x;
                    iss>>toto.y;
                    iss>>toto.z;
                    toto+=position;
                    listPVect.push_back(toto);
                }
                // f la ligne décrit un triangle à l'aide des point précédent
                // on stocke un objet de type triangle dans la liste
                if(sub == "f"){
                    int id;
                    iss>>id;
                    pVect p1 = listPVect.at(id-1);

                    iss>>id;
                    pVect p2 = listPVect.at(id-1);

                    iss>>id;
                    pVect p3 = listPVect.at(id-1);

                    this->listTriangles.push_back(Triangle(p1,p2,p3, m));
                }
            }
        }
	infile.close();
}

ModeleObj::~ModeleObj()
{
    //dtor
}

/**
* Methode permettant de connaitre le point d'impact entre un rayon et un objet model obj
* @param origin origine du rayon
* @param rayon vecteur directeur du rayon lancé
* @return un point d'impact
*/
HitPoint* ModeleObj::intersect(pVect origin, pVect rayon){

    HitPoint* result = 0;
    HitPoint* buff;
    std::list<Triangle>::iterator it;
    //on teste l'intersection avec tous les triangles contenus dans l'objet
    for(it = listTriangles.begin() ; it != listTriangles.end() ; it++){
        buff=(*it).intersect(origin,rayon);

        if(buff!=0){
            if(result==0 || result->distance > buff->distance){
                if(result != 0) delete result;
                result = buff;
            } else {
                delete buff;
            }
        }
    }
    return result;
}
